package juego;

import gui.Supervisor;
import tablero.*;
import unidad.*;
public class Logica 
{
	protected Jugador jugador;
	protected Tablero tablero;
	protected Supervisor supervisor;
	
	
	public Logica(Supervisor sup)
	{
		jugador = new Jugador();
		tablero = new Tablero();
		supervisor = sup;
	}
	
	public boolean tieneMana(float m)
	{
		return jugador.mana() >= m;
	}
	
	public void modificarMana(float m)
	{
		jugador.modificarMana(m);
	}
	
	public float obtMana()
	{
		return jugador.mana();
	}
	
	public void nuevoJugador()
	{
		jugador = new Jugador();
	}
	
	public int cantidadVidas()
	{
		return jugador.vidas();
	}
	
	public boolean perdio()
	{
		return (jugador.vidas() == 0);
	}
	
	public void modificarPuntuacion(int puntos)
	{
		jugador.modificarPuntuacion(puntos);
	}
	
	public int obtPuntuacion()
	{
		return jugador.puntuacionActual();
	}
	
	public void subirVida()
	{
		jugador.incrementarVidas();
	}
	
	public void bajarVida()
	{
		jugador.decrementarVidas();
	}

	public Unidad crearTorre(int id, int fila, int columna)
	{
		Unidad toR = null;
		if(jugador.mana() >= 50)
		{	
			toR = new Torre(id, fila, columna);
			tablero.ponerUnidad(toR, fila, columna);
			jugador.modificarMana(-50);
		}
		return toR;
	}
	
	public Unidad crearEnemigo(int id, int fila, int nivel)
	{
		Unidad toR = null;
		if(!hayUnidad(10, fila))
		{
			switch (nivel) {
				case 0: 
				{
					toR = new EnemigoNivel1(id,fila);
					break;
				}
				case 1:
				{
					toR = new EnemigoNivel2(id,fila);
					break;
				}
				case 2:
				{
					toR = new EnemigoNivel3(id,fila);
					break;
				}
				case 3:
				{
					toR = new EnemigoNivel4(id,fila);
				}
			}
			tablero.ponerUnidad(toR, fila, 10);
		}
		return toR;
	}
	
	
	public boolean atacar(Unidad atacante, Unidad defensora)
	{
		int fila = atacante.obtPosicionEnY();
		int columnaDefensora = defensora.obtPosicionEnX();
		atacante.atacar(defensora);
		boolean fueDestruido = false;
		if(defensora.vida() == 0)
		{
			jugador.modificarPuntuacion(defensora.puntosPorMorir());
			tablero.quitarUnidad(fila, columnaDefensora);
			fueDestruido = true;
		}
		return fueDestruido;
	}
	
	public int moverse(Unidad unidadAMover)
	{
		int fila = unidadAMover.obtPosicionEnY();
		int columna = unidadAMover.obtPosicionEnX();
		int movimiento = unidadAMover.movEnTablero();
		
		if(!unidadAMover.bloqueado())
		{
			int sePuedeMover = 0;//se puede mover
			if(columna > 0)
			{
				Unidad sig = tablero.obtenerUnidad(fila, columna+movimiento);
				if(sig == null)
				{
					tablero.quitarUnidad(fila, columna);
					tablero.ponerUnidad(unidadAMover, fila, columna+movimiento);
					unidadAMover.setPosicionEnX(columna+movimiento);
				}
				else 
					if(sig.movEnTablero() == 0)
						sePuedeMover = 1; //hay alguien adelante
					else sePuedeMover = 3;
			}
			else
			{
				bajarVida();
				modificarPuntuacion(-50);
				tablero.quitarUnidad(fila, columna);
				sePuedeMover = 2; //Llego al final
			}
			return sePuedeMover;
		}
		else
			return 3;	//bloquedo
	}
	
	public void ponerLuzEnTorre(Unidad uTorre, Arma a)
	{
		Torre torre = (Torre) uTorre;
		torre.addPoder(a);
	}
	
	public boolean hayUnidad(int columna, int fila)
	{
		return tablero.obtenerUnidad(fila, columna) != null;
	}
	
	public void matar(Unidad u)
	{
		tablero.quitarUnidad(u.obtPosicionEnY(),u.obtPosicionEnX());
	}
	
	public void mostrarTablero()
	{
		char tipoEne = 'T';
		int cantEnCas = 0;
		Enemigo[] unidad = new Enemigo[100];
		Torre[] torres = new Torre[20];
		Unidad aux = null;
		int indiceEne = 0;
		int indiceTorre = 0;
		System.out.println();
		System.out.println("Estado del tablero: ");
		for(int i = 0; i < 5; i++)
		{
			for(int j = 0; j < 10; j++)
			{
				if(!tablero.obtCasillero(i, j).estaLibre())
				{
					aux = tablero.obtenerUnidad(i, j);
					int ID = aux.id();
					if(ID <= 0) 
						{
							tipoEne = 'E';
							unidad[indiceEne++] = (Enemigo) aux;
						}
					else 
						{
							tipoEne = 'T';
							torres[indiceTorre++] = (Torre) aux;
						}
					cantEnCas = 1;
					System.out.print("[ "+tipoEne+cantEnCas+" ]");
					cantEnCas = 0;
				}
				else System.out.print("[ 0 ]");
			}
			System.out.println();
		}
		System.out.println();
		if(unidad[0] != null)
		{
			System.out.println("Enemigos:");
			for(int i = 0; i < 10; i++)
			{
				Enemigo aux2 = unidad[i];
				if(aux2 != null)
				{
					System.out.println("  -HP: "+aux2.vida());
				}
			}
		}
		else System.out.println("No hay enemigos");
		System.out.println();
		if(torres[0] != null)
		{
			System.out.println("Torres:");
			for(int i = 0; i < 10; i++)
			{
				Torre aux2 = torres[i];
				if(aux2 != null)
				{
					System.out.println("  -HP: "+aux2.vida());
				}
			}
		}
		else System.out.println("No hay torres");
	}
}
